// 导航到登录页面
const navigateToLogin = (redirectUrl) => {
  uni.navigateTo({
    url: `/pages/login?redirect=${encodeURIComponent(redirectUrl)}`,
  });
};

// 请求基础配置
const isDev = process.env.NODE_ENV === "development";
const BASE_URL = isDev
  ? "http://localhost:9090/api"
  : "http://8.130.16.185:9090/api";
// 判断当前平台（H5 或 小程序）
const systemInfo = uni.getSystemInfoSync();
const isH5 = systemInfo.platform === "web"; // 判断是否是 H5 平台
// 核心请求方法
const request = (config) => {
  return new Promise((resolve, reject) => {
    let cookie = null;

    // 判断是否是 H5 环境
    if (isH5) {
      // H5 环境中浏览器会自动携带 Cookie，不需要手动设置
      cookie = ""; // 留空，因为浏览器会自动处理 Cookie
    } else {
      // 在小程序中，手动从本地存储中获取 Cookie
      cookie = uni.getStorageSync("cookie"); // 获取存储的 Cookie
    }
    console.log(config);

    uni.request({
      ...config,
      url: `${BASE_URL}${config.url}`, // 拼接完整 URL
      header: {
        ...config.headers,
        // 'Content-Type': 'application/json', // 设置请求数据类型
        Cookie: cookie, // 手动设置 Cookie
      },
      withCredentials: true,
      credentials: "include", // 在请求中携带凭证
      success: (res) => {
        // 如果在小程序环境中返回了 Set-Cookie 头部
        if (!isH5 && res.header["Set-Cookie"]) {
          const setCookie = res.header["Set-Cookie"]; // 获取 Set-Cookie
          uni.setStorageSync("cookie", setCookie); // 将 Cookie 存储到本地缓存中
        }

        if (res.data.code === 40100) {
          // 如果未登录，跳转到登录页面
          uni.navigateTo({
            url: "/pages/login",
          });
          reject(new Error("未登录"));
        } else if (res.data.code === 401) {
          // 如果未授权，跳转到登录页面
          const currentPage = getCurrentPages().pop();
          const redirectUrl = currentPage
            ? `/${currentPage.route}?${encodeURIComponent(
                JSON.stringify(currentPage.options)
              )}`
            : "/";
          navigateToLogin(redirectUrl);
          reject(new Error("未授权，请登录"));
        } else {
          resolve(res.data); // 正常响应
        }
      },
      fail: (err) => {
        reject(err); // 请求失败
      },
    });
  });
};

// 封装 GET、POST、PUT、DELETE 请求方法
const myAxios = {
  get: (url, data, config = {}) =>
    request({ ...config, url, method: "GET", data }),
  post: (url, data, config = {}) =>
    request({ ...config, url, method: "POST", data }),
  put: (url, data, config = {}) =>
    request({ ...config, url, method: "PUT", data }),
  delete: (url, data, config = {}) =>
    request({ ...config, url, method: "DELETE", data }),
};

export default myAxios;
